Python numpy中的一维数组和矩阵之间的点乘和矩阵乘法计算

您所在的位置:网站首页 python 两个矩阵相乘 Python numpy中的一维数组和矩阵之间的点乘和矩阵乘法计算

Python numpy中的一维数组和矩阵之间的点乘和矩阵乘法计算

2023-10-15 03:34| 来源: 网络整理| 查看: 265

在numpy中,一维数组是一个很奇葩的存在,在数组与矩阵计算时,很容易产生混淆,到底数组在矩阵计算时是应当作为行向量还是列向量呢?

经过测试,本文预先给出如下结论:

1.数组点乘矩阵时,将数组看做是行向量,按行依次与矩阵最内层方括号的内容(最后一个维度)点乘。 2.数组左乘矩阵时,将数组作为行向量,结果的维度数减1。 3.数组右乘矩阵时将数组作为列向量,结果的维度数减1。 4.注意: 上述计算中的数组和矩阵需分别对应点乘和矩阵乘法的数据长度规则,遇到长度不同时,将报错

 

1.数组与数组和数组与矩阵之间的点乘

1.1数组与数组之间的点乘

数组之间维度相同时,可以任意进行点乘和点除计算,其他的计算如,sqrt、power、log等运算都是对每个元素进行计算的,此时,完全可以将数组看作是二维行向量。相关的结果与二维行向量的结果是一致的。

# _*_coding: UTF-8_*_ # 开发作者 :TXH # 开发时间 :2020-09-30 11:58 # 文件名称 :数组乘除.py # 开发工具 :Python 3.7 + Pycharm IDE import numpy as np # 数组点乘点除,最后一个维度相同可以计算 a=np.array([1,2,3,4]) b=np.array([2,4,6,8]) print('#'*30) print('a=',a,'维度为:',a.shape,'\nb=',b,'维度为:',b.shape,'\na.*b=',a*b,'\na./b=',a/b) print('矩阵乘法结果为:',a.dot(b)) print('#'*30,'\n') >>> ############################## a= [1 2 3 4] 维度为: (4,) b= [2 4 6 8] 维度为: (4,) a.*b= [ 2 8 18 32] a./b= [0.5 0.5 0.5 0.5] 矩阵乘法结果为: 60 ##############################

1.2数组与矩阵的点乘

数组与矩阵之间的点乘,要求数组的长度和矩阵最后一个维度的长度的相同,例如数组形状为(3,),则需要对应的矩阵形状为(3,)、(a,3)、(a,b,3)才能进行点乘计算。特殊情况:(n,)数组和(n,1)阶矩阵计算得到(n,n)阶矩阵。

# 数组与矩阵的乘除法 ''' 数组与矩阵的最后一个维度长度相同 ''' a=np.array([1,2]) # 维度为(2,) b=np.array([[2],[6]]) # 维度为(2,1) b2=np.array([[2,2],[6,3]]) # 维度为(2,2) b3=np.array([[2,2],[6,3],[1,1]]) # 维度为(3,2) b4=np.array([[2,2,1],[6,3,1]]) # 维度为(2,3) # 数组对矩阵每一行按行求点乘,得到 print(a*b) # (2,)*(2,1)=(2,2) # 按行求点乘 print(a*b2) # (2,)*(2,2)=(2,2) # 按行求点乘 print(a*b3) # (2,)*(3,2)=(3,2) # 按行求点乘 # print(b4*a) # (2,)*(2,3)=() 报错

 

2.数组与矩阵相乘

在进行np.dot() 矩阵乘法时,若数组左乘矩阵:则可将其作为行矢量。若数组右乘矩阵,则可将数组作为列矢量。相应的矩阵在右时,其最后一个维度的长度必须与数组长度一致,矩阵在乘法左侧时,其第一个维度必须与矩阵的长度一致。

print(a.dot(b)) # (2,)*(2,1)=(1,) # 按列求内积,结果为数组 # print(a.dot(b.T)) # (2,)*(1,2)=(1,) # 报错 print(a.dot(b2)) # (2,)*(2,2)=(2,) # 按列求内积,结果为数组 print(b3.dot(a)) # (3,2)*(2,)=(3,) # 按行求内积,结果为数组 print(a.dot(b4)) # (2,)*(2,3)=(3,) # 按列求内积,结果为数组 # 三维验证 a=np.array([[[1,1,1], [2,2,2]], [[3,3,3], [4,4,4]], [[5,5,5], [6,6,6]], ]) #(2,3,3) b=np.array([1,1,1]) #(3,) print(a*b) # 将三维矩阵看做是(2,3)阶矩阵,每个元素为(3,)矩阵。每个元素与b计算点乘后放回结果,最后得到(2,3,3)阶矩阵 print(a.dot(b)) # 将三维矩阵看做是(2,3)阶矩阵,每个元素为(3,)矩阵。每个元素与b计算内积后放回结果,最后得到(2,3)阶矩阵 # print(b.dot(a)) # 报错 3.小结

      从上述实例来看,数组在进行矩阵乘法时计算结果与二维矢量的计算时相同的,只是数组计算完后会少一个维度(其实也就是数据少了一层方括号而已)。数组与矩阵的点乘需要注意(n,)数组和(n,1)阶矩阵点乘的特殊情况,其他情况下直接看做按行点乘即可。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3